package com.common.boot.generator;

import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.common.boot.em.DataSourceConfigEnum;
import org.apache.commons.lang3.StringUtils;

import java.util.Scanner;

/**
 * @author tanghailan
 * @date 2020-10-22 9:27
 */
// 演示例子，执行 main 方法控制台输入模块表名回车自动生成对应项目目录中
public class CodeGenerator {
  /** 读取控制台内容 */
  public static String scanner(String tip) {
    Scanner scanner = new Scanner(System.in);
    System.out.println("请输入" + tip + "：");
    if (scanner.hasNext()) {
      String ipt = scanner.next();
      if (StringUtils.isNotEmpty(ipt)) {
        return ipt;
      }
    }
    throw new MybatisPlusException("请输入正确的" + tip + "！");
  }

  public static void main(String[] args) {
    DataSourceConfigEnum configEnum = DataSourceConfigEnum.sxml;
    // 创建代码生成器
    AutoGenerator mpg = new AutoGenerator();

    // 全局配置
    GlobalConfig gc = new GlobalConfig();
    gc.setOutputDir(scanner("请输入你的项目路径") + "/src/main/java");
    gc.setAuthor(configEnum.getAuthor());
    gc.setOpen(false);
    // 实体属性 Swagger2 注解
    gc.setSwagger2(false);
    // 重新生成时是否自动覆盖
    gc.setFileOverride(false);
    // %s 为占位符
    // mp 生成service层代码，默认接口名称第一个字母是有I
    gc.setServiceName("%sManager");
    gc.setServiceImplName("%sManagerImpl");
    // 设置主键生成策略
    gc.setIdType(configEnum.getIdType());
    // 设置date的类型   使用 java.util.date 代替
    gc.setDateType(configEnum.getDateType());
    mpg.setGlobalConfig(gc);

    // 数据源配置
    DataSourceConfig dsc = new DataSourceConfig();
    dsc.setUrl(configEnum.getUrl());
    // dsc.setSchemaName("public");
    dsc.setDriverName(configEnum.getDriverName());
    dsc.setUsername(configEnum.getUsername());
    dsc.setPassword(configEnum.getPassword());
    dsc.setDbType(configEnum.getDbType());
    mpg.setDataSource(dsc);

    // 包配置
    PackageConfig pc = new PackageConfig();
    pc.setModuleName(scanner("请输入模块名"));
    pc.setParent("com.zdvictory");
    pc.setController("controller");
    pc.setService("manager");
    pc.setServiceImpl("manager.impl");
    pc.setMapper("mapper");
    pc.setEntity("entity");
    pc.setXml("mapper");
    mpg.setPackageInfo(pc);

    // 策略配置
    StrategyConfig strategy = new StrategyConfig();
    strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
    // 实体类名称驼峰命名
    strategy.setNaming(NamingStrategy.underline_to_camel);
    // 列名称驼峰命名
    strategy.setColumnNaming(NamingStrategy.underline_to_camel);
    // lombok
    strategy.setEntityLombokModel(true);
    strategy.setChainModel(true);
    // 使用RestController风格
    strategy.setRestControllerStyle(true);
    // 忽略表中生成实体类的前缀
    strategy.setTablePrefix(configEnum.getTablePrefix());
    mpg.setStrategy(strategy);
    mpg.execute();
  }
}
